package com.guaoran.interview.before.jd;

/**
 * @author : guCheng
 * @title : Spring 
 * @Description : 
 * 	 
 * @date :2018年3月20日下午9:51:22
 */
public class Spring {

	
	/*
	  1、Spring装配机制：
	 	1.使用xml方式显示配置
	 	2.使用java方法显示配置
	 	3.使用注解方式隐式发现扫描和自动配置。
	  
	  2、SpringMVC请求流程：
	  	1.用户发送请求到前端控制器，DispacherServlet，
	  	2.DispacherServlet收到请求，调用HanderMapping处理器，找到对应的处理器，返回到DispatcherServlet
	  	3.DispatcherServlet找到对应的controller进行处理，
	  	4.controller进行处理完成后返回modelandView，然后根据视图解析器找到对应的视图，
	  	5.返回并渲染视图
		6.DispatcherServlet响应用户
	  	
	  	
	  	
	  3、Spring事务：
	  	1.spring对Error和RunntimeException进行回滚事务，
	  	2.事务管理有两种，
	  		一种是使用编程式事务：配置文件，tx和aop切面编程进行管理，
	  		一种是声明式事务：采用注解，@transaction
	  	3.事务具有：原子性、一致性、隔离性、持久性。
	  
	  4.Spring的核心AOP和IOC
	  	1.AOP：面向切面纵向编程：
	  		1.AOP为了实现将复用的模块进行封装，减少重复的代码，实现松耦合，从而提高系统的可维护性。
	  		2.AOP是通过jdk动态代理和cglib代理实现的。
	  		3.权限、事务、异常都可以通过apo进行管理
	  	2.IOC：采用DI控制反转和依赖注入，
	  		1.当某个角色需要另外一个角色协助时，由调用者创建被调用者的工作交给Spring去做，Spring通过注入的方式进行
	  		2.依赖注入的方式常用有三种，1.set注入，2.构造方式注入，3.使用注解@Autowider注入
	  		
	  5.jdk动态代理和cglib代理
	  	1.jdk动态代理：其代理对象必须是某个接口的实现，通过在运行期间创建一个接口的实现类来完成对目标对象的代理
	  		对实现接口的类进行代理，动态生成一个匿名类，在调用方法前通过调用InvokeHandler来处理。如果实现了接口默认采用jdk动态代理，
	  	2.cglib代理：通过对代理对象的class文件加载进来，对其进行字节码操作实现的。
	  		是采用asm（字节码编辑类库）操作字节码实现的，性能比jdk高，如果目标对象没有实现接口，必须采用cglib代理，如果实现了代理，也可以强制采用cglib代理。
	  	3.静态代理：通过程序或工具生成代理类的源码，在编译成代理类，静态指：在程序运行期间已经存在代理类的字节码文件了。

	    [
	    1.jdk动态代理和cglib代理
	 	1.jdk动态代理是利用反射机制生成一个实现代理接口的匿名类，在调用具体方法前调用InvokeHandler来处理。
	 	2.cglib代理是利用asm开源包，对代理对象类的class文件加载进来，通过修改其字节码生成子类来处理
	  	]


	  6.BeanFactory与ApplicationContext
	  	1.都是生成SpringBean的工厂，并管理容器中的bean。BeanFactory需要手动注册，而ApplicationContext则是自动注册
	  	2.BeanFactory：加载程序的时候，采用延迟加载，只有在用到时getBean时采用加载。
	  	3.ApplicationContext：
	  		1.是BeanFactory的子接口，加载程序的时候，会加载所有的bean，
	  		2.MessageSource国际化消息的支持
	  		3.Resource资源访问，如URL和文件 的支持
	  		4.强大的事件机制
	  		
	  7.Spring中用到的设计模式
	  	代理模式、观察者模式、单例模式、简单工厂、工厂方法、适配器模式、策略模式
	  	
	  8.pring的优点？
		1.降低了组件之间的耦合性 ，实现了软件各层之间的解耦 
		2.可以使用容易提供的众多服务，如事务管理，消息服务等 
		3.容器提供单例模式支持 
		4.容器提供了AOP技术，利用它很容易实现如权限拦截，运行期监控等功能 
		6.spring对于主流的应用框架提供了集成支持，如hibernate，JPA，Struts等 
		7.spring属于低侵入式设计，代码的污染极低 
		8.独立于各种应用服务器 
		9.spring的DI机制降低了业务对象替换的复杂性 
		10.Spring的高度开放性，并不强制应用完全依赖于Spring，开发者可以自由选择spring 的部分或全部 
	  
	  15.Springmvc的优点
		1.它是基于组件技术的.全部的应用对象,无论控制器和视图,还是业务对象之类的都是 java组件.并且和Spring提供的其他基础结构紧密集成.
		2.不依赖于Servlet API(目标虽是如此,但是在实现的时候确实是依赖于Servlet的)
		3.可以任意使用各种视图技术,而不仅仅局限于JSP
		4.支持各种请求资源的映射策略
		5.它应是易于扩展的
		
		
	 * */
}
